package com.hexacta.hrs.sandbox.meetings.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

/**
 * Representa un tema sobre el que se quiere tratar en la reunion. 
 * Cada tema tiene actividades asociadas (activity).
 * @author ncortinez
 *
 */

@Entity
public class Theme implements Serializable{
	
	@Transient
	private static final long serialVersionUID = 6590226873977624646L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;

	private String description;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy="myTheme")
	private List<Activity> activities;
    
    @ManyToOne
    private Meeting meeting;
	
    public Theme() {
		super();
		activities = new ArrayList<Activity>();
	}
	
	/**
	 * Devuelve un Boolean que inidica si el tema esta cerrado.
	 * El tema va a estar cerrado siempre que todas sus actividades esten cerradas 
	 */
	@Transient
	public Boolean isClosed() {
		//Cuando no tiene ninguna actividad debe estar abierto
		if (getActivities().isEmpty()){
			return Boolean.FALSE;
		}

		//Si alguna de sus actividades esta abierto, entonces el tema no va a estar cerrado
		for(Activity unaActividad : getActivities()){
			if(!unaActividad.isClosed()){
				return Boolean.FALSE;
			}
		}
		return Boolean.TRUE;
	}
	
	@Transient
	public Boolean isOpen(){
		return !this.isClosed();
	}

	public void addActivity(String descripcion){
		Activity activity = new Activity();
		activity.setDescription(descripcion);
		activity.setMyTheme(this);
		this.activities.add(activity);
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String descripcion) {
		this.description = descripcion;
	}

	public List<Activity> getActivities(){
		return this.activities;
	}
	
	public void setActivities(List<Activity> activities) {
		this.activities = activities;
	}

	public void setMeeting(Meeting meeting) {
		this.meeting = meeting;
	}

	public Meeting getMeeting() {
		return meeting;
	}


}
